--- %%NOBANNER%% -->
![]() | ![]() |
/*------------------<-- Start of Description -->--------------------\ | Samples with Replacement; | |--------------------<-- End of Description -->---------------------| |--------------------------------------------------------------------| |--------------<-- Start of Files or Arguments Needed -->-----------| | Arguments: | | Indata=name of input dataset | | var=variable on which the bootstrap samples are to be drawn | | one or more variables, variables must be separated by space, | | all variables given will be left in the output dataset; | | bootn= B, number of samples you want to generate; | | Seed= initial seed for RANUNI function | | outseed=output seed name, usually when bootstrap needs more than | | one loop, we may need to run the same function repeatedly| | so we may need to keep the seed generated previously from| | this function; | | Outdata=name of the output dataset containing the bootstrap | | samples. There is one observation for each sample with | | the n members of the sample contained in the variables | | BS&x.1-BS&x.N . | |---------------<-- End of Files or Arguments Needed -->------------| |--------------------------------------------------------------------| |----------------<-- Start of Example and Usage -->-----------------| | Example: | | data case; | | retain Seed_1 45; | | do i=1 to 10; | | call ranuni(Seed_1,X1); | | x1=ceil(x1*10); | | n=i; | | output; | | end; | | run; | | %prt(case); | | %sample(Indata=case,var=x1 n1,seed=679897321,outdata=two, | | outseed=myseed); | | %prt(two); | | %sample(Indata=case,var=x1,seed=&myseed,outdata=three, | | outseed=myseed); | | %prt(three); | | Usage: sample(Indata=,var=,bootn=,seed=679897321,outdata=,outseed=)| \-------------------<-- End of Example and Usage -->---------------*/ %MACRO sample(Indata=,var=,bootn=1,seed=679897321,outdata=, outseed=); /*--------------------------------------------\ | Author: E. Bergstralh; | | Created: March 15, 1994; | | Purpose: Select Bootstrap Samples; | \--------------------------------------------*/ %global &outseed resampleid; %local _Bootseed_; %if (%quote(%upcase(seed)) eq %quote(%upcase(&outseed))) %then %do; %put ==> Alert! The output seed cannot be "seed" or "SEED".; %goto finish; %end; %if (%chk_type(&seed) = 1) %then %let _Bootseed_=&seed; %else %let _Bootseed_=679897321; %if (%chk_type(&resampleid) ne 1) and (%chk_type(&bootn) ne 1) %then %let resampleid=1; %else %if (%chk_type(&bootn) ne 1) %then %let resampleid=%eval(&resampleid+1); %if (%quote(&outdata) ne) and (%quote(&indata) ne) and (%quote(&var) ne) %then %do; %if (%nobs(&indata) >= 1) %then %do; %let _bootvi_=0; %do %while(%length(%nrbquote(%scan(%nrbquote(&var), %eval(&_bootvi_+1), %str((), ))))); %let _bootvi_=%eval(&_bootvi_+1); %let _bootvari_=%nrbquote(%qscan(%nrbquote(&var), &_bootvi_, %str((), ))); %if (%varnum(&indata, &_bootvari_) < 1) %then %do; %put ==> Alert! Input dataset %trim(%left(%upcase(&indata))) does not have variable or variables %trim(%left(%upcase(&_bootvari_)))!; %goto finish; %end; %end; %let _bootvi_=%eval(&_bootvi_+1); options nonotes; data &outdata; _Bootseed_=&_Bootseed_; %if (%chk_type(&bootn) = 1) %then %do; do booti=1 to &bootn; %end; do bootj=1 to _bootnobs_; _seed_=_Bootseed_; CALL RANUNI(_Bootseed_,_bootr_); resampleid=%if (%chk_type(&bootn) = 1) %then %do; booti %end; %else %do; &resampleid; %end;; _booti_=ceil(_bootr_*_bootnobs_); i=_booti_; set &indata(keep=&var) point=_booti_ nobs=_bootnobs_ ; output; end; %if (%chk_type(&bootn) = 1) %then %do; end; %end; CALL SYMPUT("_Bootseed_",_Bootseed_); stop; keep &var resampleid; RUN; options notes; %end; %else %put ==> Alert! Input dataset %trim(%left(%upcase(&indata))) does not exist or does not have any observations!; %end; %else %put ==> Alert! No output or input dataset!; %if (%quote(&outseed) ne) %then %let &outseed=&_Bootseed_; %finish: %MEND sample;